package com.CodeCraft.utils;

import java.io.InputStream;
import java.util.*;

/**
 * <p>
 * 描述: 配置文件工具类，用于加载和读取 properties 配置文件
 * </p>
 *
 * @author Dorain
 * @version 1.0.0
 * @since 2025/3/30
 */
public class PropertiesUtils {
    // 静态Properties对象，用于存储加载的配置属性
    private static Properties props = new Properties();
    // 静态Map，用于缓存配置属性键值对
    private static Map<String, String> PROPS_MAP = new HashMap<>();

    // 静态代码块，在类加载时执行，用于初始化配置
    static {
        // 定义输入流变量
        InputStream is = null;
        try {
            // 获取配置文件流
            // 通过类加载器从classpath根目录加载application.properties文件
            is = PropertiesUtils.class.getClassLoader().getResourceAsStream("application.properties");

            // 加载配置文件
            // 将配置文件内容加载到Properties对象中
            props.load(is);

            // 遍历配置文件，通过迭代器遍历
            // 获取Properties中所有key的集合的迭代器
            Iterator<Object> iterator = props.keySet().iterator();

            // 遍历所有配置项
            while (iterator.hasNext()) {
                // 获取key（强制转换为String类型）
                String key = (String) iterator.next();
                // 根据key获取对应的value
                String value = props.getProperty(key);
                // 将键值对存入Map缓存
                PROPS_MAP.put(key, value);
            }
        } catch (Exception e) {
            // 捕获并处理异常（当前为空实现，建议至少打印日志）

        } finally {
            // 确保输入流被关闭
            if (is != null) {
                try {
                    // 关闭输入流
                    is.close();
                } catch (Exception e) {
                    // 打印关闭流时的异常堆栈
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 对外提供的静态方法，用于根据key获取配置值
     * @param key 配置项的key
     * @return 返回配置项的值，如果不存在则返回null
     */
    public static String getProperty(String key) {
        // 从缓存Map中获取对应的配置值

        return PROPS_MAP.get(key);
    }
}
